#!/bin/bash

# Mall Admin Docker Build Script
# 自动化构建脚本，用于微信云托管CICD流程

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 错误处理函数
handle_error() {
    local exit_code=$?
    local line_number=$1
    log_error "构建失败，退出码: $exit_code，行号: $line_number"
    log_error "请检查上述错误信息并修复问题后重试"
    exit $exit_code
}

# 设置错误陷阱
trap 'handle_error $LINENO' ERR

# 检查必要工具
check_prerequisites() {
    log_info "检查构建环境..."
    
    if ! command -v mvn &> /dev/null; then
        log_error "Maven未安装或不在PATH中"
        exit 1
    fi
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker未安装或不在PATH中"
        exit 1
    fi
    
    log_success "构建环境检查通过"
}

# 清理函数
cleanup() {
    log_info "清理临时文件..."
    # 这里可以添加清理逻辑
}

# 构建依赖模块
build_dependencies() {
    log_info "开始构建依赖模块: mall-common, mall-mbg, mall-security"
    
    # 检查依赖模块是否存在
    local modules=("mall-common" "mall-mbg" "mall-security")
    for module in "${modules[@]}"; do
        if [ ! -d "$module" ]; then
            log_error "依赖模块 $module 不存在"
            exit 1
        fi
    done
    
    log_info "执行依赖模块构建命令: mvn clean install -pl mall-common,mall-mbg,mall-security -am"
    
    # 构建依赖模块
    if mvn clean install -pl mall-common,mall-mbg,mall-security -am -q; then
        log_success "依赖模块构建完成"
    else
        log_error "依赖模块构建失败"
        exit 1
    fi
}

# 构建mall-admin模块
build_mall_admin() {
    log_info "开始构建mall-admin模块"
    
    # 检查mall-admin模块是否存在
    if [ ! -d "mall-admin" ]; then
        log_error "mall-admin模块不存在"
        exit 1
    fi
    
    if [ ! -f "mall-admin/pom.xml" ]; then
        log_error "mall-admin/pom.xml文件不存在"
        exit 1
    fi
    
    log_info "执行mall-admin构建命令: mvn clean package -f mall-admin/pom.xml"
    
    # 构建mall-admin模块
    if mvn clean package -f mall-admin/pom.xml -q; then
        log_success "mall-admin模块构建完成"
        
        # 检查JAR文件是否生成
        local jar_file=$(find mall-admin/target -name "*.jar" -not -name "*-sources.jar" | head -1)
        if [ -n "$jar_file" ] && [ -f "$jar_file" ]; then
            log_success "JAR文件生成成功: $jar_file"
        else
            log_error "JAR文件未找到"
            exit 1
        fi
    else
        log_error "mall-admin模块构建失败"
        exit 1
    fi
}

# 构建Docker镜像
build_docker_image() {
    log_info "开始构建Docker镜像"
    
    # 检查Dockerfile是否存在
    if [ ! -f "Dockerfile" ]; then
        log_error "Dockerfile不存在"
        exit 1
    fi
    
    # 获取镜像标签（可以通过参数传入，默认为latest）
    local image_tag=${1:-"mall-admin:latest"}
    
    log_info "构建Docker镜像: $image_tag"
    
    # 构建Docker镜像
    if docker build -t "$image_tag" .; then
        log_success "Docker镜像构建完成: $image_tag"
        
        # 显示镜像信息
        log_info "镜像信息:"
        docker images "$image_tag" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
    else
        log_error "Docker镜像构建失败"
        exit 1
    fi
}

# 主函数
main() {
    local start_time=$(date +%s)
    
    log_info "========================================="
    log_info "Mall Admin Docker构建脚本开始执行"
    log_info "========================================="
    
    # 解析命令行参数
    local image_tag="mall-admin:latest"
    local skip_deps=false
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            -t|--tag)
                image_tag="$2"
                shift 2
                ;;
            --skip-deps)
                skip_deps=true
                shift
                ;;
            -h|--help)
                echo "用法: $0 [选项]"
                echo "选项:"
                echo "  -t, --tag TAG     指定Docker镜像标签 (默认: mall-admin:latest)"
                echo "  --skip-deps       跳过依赖模块构建"
                echo "  -h, --help        显示帮助信息"
                exit 0
                ;;
            *)
                log_error "未知参数: $1"
                exit 1
                ;;
        esac
    done
    
    # 执行构建步骤
    check_prerequisites
    
    if [ "$skip_deps" = false ]; then
        build_dependencies
    else
        log_warning "跳过依赖模块构建"
    fi
    
    build_mall_admin
    build_docker_image "$image_tag"
    
    # 计算构建时间
    local end_time=$(date +%s)
    local duration=$((end_time - start_time))
    
    log_info "========================================="
    log_success "构建完成！总耗时: ${duration}秒"
    log_info "Docker镜像: $image_tag"
    log_info "========================================="
}

# 注册清理函数
trap cleanup EXIT

# 执行主函数
main "$@"